package com.ideaaedi.zoo.example.springboot.seata_dynamicds_sharding.alpha.controller;

import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
import com.ideaaedi.zoo.example.springboot.seata_dynamicds_sharding.alpha.service.BizService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.annotation.Resource;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;


@RestController
@RequestMapping
@Tag(name ="测试")
public class TestController {
    
    @Resource
    private BizService bizService;
    
    /**
     * <pre>
     * 断点时，观察数据：
     *   这六张表
     *   student表, 有一条数据:
     *       Beta 夏洛         (这条数据是beta服务添加的)
     *                         注：本服务还添加了两条 【Alpha 夏洛】数据，因为本方法还没执行完，所以也没提交。
     *                            bizService.test()方法上的@Transactional注解管理的是默认数据源mysqlAlpha；
     *                            而这两条【Alpha 夏洛】的插入，就是用的数据源mysqlAlpha。@Transactional在
     *                            起作用，所以断点时看不到这两条【Alpha 夏洛】
     *
     *   teacher表, 有三条数据:
     *       Alpha 蒋老师       (这条数据是本服务添加的。因为bizService.test()方法上的@Transactional注解，管的是本地数据源是mysqlAlpha；而这条数据是数据源oracleAlpha的操作，所以直接提交了)
     *       Alpha 蒋老师       (这条数据是本服务添加的。因为bizService.test()方法上的@Transactional注解，管的是本地数据源是mysqlAlpha；而这条数据是数据源oracleAlpha的操作，所以直接提交了)
     *       Beta 蒋老师        (这条数据是beta服务添加的)
     *   pay_record_202408和pay_record_202409、trans_record_202408和trans_record_202409 表, 都分别有三条数据。以trans_record_202409的数据为例进行说明：
     *        Alpha 备注B       (这条数据是本服务添加的。因为ShardingSphere的BASE分布式事务不支持隔离级别，所以此时哪怕方法还没结束，我们也能查询到其插入的数据了)
     *        Beta 备注B        (这条数据是beta服务添加的)
     *        Alpha 备注B       (这条数据是本服务添加的。因为ShardingSphere的BASE分布式事务不支持隔离级别，所以此时哪怕方法还没结束，我们也能查询到其插入的数据了)
     *
     * 断点后，观察数据：没有任何数据了，都被seata回滚了
     * </pre>
     */
    @GetMapping("/test")
    @Operation(summary = "【注解方式】本地alpha服务和远程beta服务（通过feign调用）"
            + "添加数据(涉及到的数据源有：mysqlAlpha、oracleAlpha、shardingAlpha、mysqlBeta、oracleBeta、shardingBeta)，"
            + "然后本地异常，触发分布式事务回滚")
    @ApiOperationSupport(order = 1)
    public void test() {
        bizService.test();
    }
    
    /**
     *
     * 测试结论：可以嵌套使用
     *
     * <pre>
     * 断点时，观察数据：是有相关数据的（这里就不一一说明了）
     *
     * 断点后，观察数据：没有任何数据了，都被seata回滚了
     * </pre>
     */
    @GetMapping("/testNested")
    @Operation(summary = "【注解方式】测试嵌套使用")
    @ApiOperationSupport(order = 2)
    public void testNested() {
        bizService.testNested();
    }
    
    /**
     * <pre>
     * 断点时，观察数据：是有相关数据的（这里就不一一说明了）
     *
     * 断点后，观察数据：没有任何数据了，都被seata回滚了
     * </pre>
     */
    @GetMapping("/testManual")
    @Operation(summary = "【手动方式】先feign调用beta微服务添加beta数据，然后本地添加alpha数据失败")
    @ApiOperationSupport(order = 3)
    public void testManual() {
        bizService.testManual();
    }
    
    /**
     *
     * 测试结论：可以嵌套使用
     *
     * <pre>
     * 断点时，观察数据：是有相关数据的（这里就不一一说明了）
     *
     * 断点后，观察数据：没有任何数据了，都被seata回滚了
     * </pre>
     */
    @GetMapping("/testNestedManual")
    @Operation(summary = "【手动方式】测试嵌套使用")
    @ApiOperationSupport(order = 4)
    public void testNestedManual() {
        bizService.testNestedManual();
    }
}
